package statistics.poznavaniTextu;

import statistics.Agregace;
import statistics.Asonance.AsonanceFixniPosun;
import statistics.Asonance.IAsonance;
import text.DejCetnosti;

import java.util.ArrayList;
import java.util.HashMap;

public class CharakteristikaTextu extends ACharakteristiky{
  String jmeno;
  String autor;
  HashMap<String, Double> hodnoty = new HashMap<>();

  public CharakteristikaTextu(String jmeno, ArrayList<String> text, String autor) {
    this.jmeno = jmeno;
    this.autor = autor;
    urciHodnoty(text);
    System.out.println(this);
  }

  @Override
  public String toString() {
    String s = "";
    s += jmeno + ";";
    s += hodnoty.get("asonance7") + ";";
    s += hodnoty.get("asonance6") + ";";
    s += hodnoty.get("asonance5") + ";";
    s += hodnoty.get("asonance4") + ";";
    s += hodnoty.get("pocetSlov12") + ";";
    s += hodnoty.get("asonance3") + ";";
    s += hodnoty.get("asonance2") + ";";
    s += hodnoty.get("asonance1") + ";";
    s += hodnoty.get("pocetSlovVRymu") + ";";
    s += hodnoty.get("asonance9") + ";";
    s += hodnoty.get("asonance8") + ";";
    s += hodnoty.get("pocetSlov10plus") + ";";
    s += hodnoty.get("pocetSlov3") + ";";
    s += hodnoty.get("pocetSlov4") + ";";
    s += hodnoty.get("pocetSlov5") + ";";
    s += hodnoty.get("asonance10") + ";";
    s += hodnoty.get("pocetSlov6") + ";";
    s += hodnoty.get("pocetSlov7") + ";";
    s += hodnoty.get("pocetSlov8") + ";";
    s += hodnoty.get("pocetSlov9") + ";";
    return s;
  }

  public CharakteristikaTextu(String jmeno, HashMap<String, Double> hodnoty) {
    this.jmeno = jmeno;
    this.hodnoty = hodnoty;
  }

  private void urciHodnoty(ArrayList<String> text) {
    pocetSlovVeVersi(text);
    cetnostiSlovDleDelky(text);
    asonance(text);
    //agregace(text);
  }

  private void pocetSlovVeVersi(ArrayList<String> text) {
    DejCetnosti.SlovVeVersi slovVeVersiCetnost = new DejCetnosti().dejSlovVeVersi(text);
    double prumerSlovVeVersi = slovVeVersiCetnost.dejPrumerHM();
    hodnoty.put(pocetSlovVRymu, prumerSlovVeVersi);
  }

  private void  cetnostiSlovDleDelky(ArrayList<String> text) {
    DejCetnosti.DelkaSlova delkaSlova = new DejCetnosti().dejDelkuSlova(text, true);
    delkaSlova.run();
    HashMap<Integer, Integer> delkySlova = delkaSlova.getHm();

    //..1 a 2 písmena
    int jednaDve = ((delkySlova.get(1)==null)? -1 : delkySlova.remove(1)) + ((delkySlova.get(2) == null) ? -1 : delkySlova.remove(2));
    hodnoty.put(pocetSlov(1), (double) jednaDve);

    //..3-9
    for(int i = 3; i < 10; i++) {
      try {
        hodnoty.put(pocetSlov(i), (double) delkySlova.remove(i));
      } catch (NullPointerException ex) {
        hodnoty.put(pocetSlov(i), 0d);
      }
    }

    //..10 a víc
    int desetPlus = 0;
    for (int i : delkySlova.values()) {
      desetPlus += i;
    }

    hodnoty.put(pocetSlov(10), (double) desetPlus);
  }

  private void asonance(ArrayList<String> text) {
    for (int i = 1; i <= 10; i++) {
      try {
        IAsonance a = new AsonanceFixniPosun(text, i, this.jmeno);
        double asonance = a.getaTest().getMereni().get(0).getHodnoty().get(0);
        hodnoty.put(asonance(i), asonance);
      } catch (Exception ex) {
        ex.printStackTrace();
      }
    }
  }

  private void agregace(ArrayList<String> text) {
    Agregace a = new Agregace(text);
    hodnoty.put(agregaceA, a.getMncA());
    hodnoty.put(agregaceB, a.getMncB());
  }
}